# Other issue
***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.***
---
# What should I do if the device becomes excessively hot?
## Confirm whether the temperature is actually too high
Run the following command to obtain the current device temperature:
```bash
qpi-config dump temperature
```
If the temperature exceeds 80 °C, take cooling measures immediately.
## Identify the heat source
Check CPU utilization and frequency:
```bash
# Check CPU utilization.
top -b -n 1 | head -20
# Check the operating frequency of each CPU core to determine whether it remains at the maximum frequency.
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
# Check whether the performance governor is enabled.
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
```
Check GPU utilization:
```bash
cat /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage 2>/dev/null
cat /sys/class/kgsl/kgsl-3d0/max_gpuclk 2>/dev/null
```
Check storage utilization:
```bash
iostat -x 1 3 # Check %util.
```
## Software cooling measures
Lower the CPU frequency:
```bash
# Check available frequencies.
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
# Set the maximum frequency, for example, to 1.6 GHz.
echo 1651200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
```
Switch the CPU governor to schedutil:
```bash
echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
```
Lower the maximum GPU operating frequency:
```bash
# Check available frequencies.
cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies
# Set the maximum frequency, for example, to 550 MHz.
echo 550000000 > /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
```
Check for processes with abnormal CPU usage:
```bash
ps aux --sort=-%cpu | head -10
```
## Physical cooling measures
- Place the Quectel Pi H1 in a well-ventilated environment.
- Install an active cooling module. The fan should increase its speed automatically when the device temperature exceeds the configured threshold.
# What should I do if a library does not work correctly?
## Identify and classify the issue
- Link error: The compiler reports *cannot find -lxxx*, or the error *cannot open shared object file* occurs at runtime.
- Runtime crash: The application reports *undefined symbol: xxx* or triggers a *Segmentation fault*.
- Functional error: The library loads successfully, but a specific API does not respond or returns an unexpected error code.
## Check whether the library file exists and verify the library search path
```bash
# 1. Locate the library.
find /usr/lib /usr/local/lib /lib -name "libxxx.so*"
# 2. Check whether the dynamic linker can locate the library.
ldconfig -p | grep libxxx
# 3. Check whether LD_LIBRARY_PATH contains the directory.
echo $LD_LIBRARY_PATH
```
If the library is in a nonstandard directory, set *LD_LIBRARY_PATH*, or add the directory to a configuration file under */etc/ld.so.conf.d/* and run **ldconfig** to update the cache.
## Check dependencies to resolve undefined symbols
```bash
# Check the library dependencies (safer than ldd because it does not execute code).
readelf -d /path/to/libxxx.so | grep NEEDED
# Check whether a symbol is defined in the library.
nm -D /path/to/libxxx.so | grep " T " | grep symbol_name
# Alternatively:
readelf -s /path/to/libxxx.so | grep symbol_name
```
An undefined symbol usually indicates a library version mismatch or a missing dependency. If the symbol exists but the application still reports an error, the cause may be link order or ABI incompatibility.
## Check library version and ABI compatibility
```bash
# Check the embedded library version string.
strings /path/to/libxxx.so | grep -i version
# Check the library's SONAME (the name used by the dynamic linker).
readelf -d /path/to/libxxx.so | grep SONAME
```
If the application was linked against *libxxx.so.1* at build time but the system provides only *libxxx.so.2*, ABI incompatibility may still cause the application to crash at runtime even if the newer library exports the required symbols. After confirming that the two library versions are ABI-compatible, you can create a symbolic link (**ln -s libxxx.so.2 libxxx.so.1**) as a temporary workaround. For a long-term solution, install a library version compatible with the application or rebuild the application against the library available on the system.
## Trace dynamic library loading at runtime (to diagnose loading failures)
```bash
# 1. Check which libraries the dynamic linker loads and whether it loads an incorrect version.
LD_DEBUG=libs ./your_app 2>&1 | grep libxxx
# 2. Use strace to trace attempts to open library files.
strace -e openat,open ./your_app 2>&1 | grep libxxx
# 3. If the application crashes immediately after startup, use gdb to locate the crash.
gdb ./your_app
(gdb) run
(gdb) bt # Check the call stack after the crash.
```
# How can I update a third-party driver?
1. Obtain the official SDK. See [Image build](<../../Operating system/Yocto Linux/Image build/Image build.md>) for download instructions.
2. Add the third-party driver source code under *sources/quectel-src/kernel*.
3. Add the device tree node for the peripheral to *sources/quectel-src/kernel/qcom-6.6/arch/arm64/boot/dts/qcom/qcs6490-idp-pi.dts*.
4. Build the system image, flash it to the Quectel Pi H1, and then test the driver functionality.
# What should I do if system performance is poor?
Poor performance is usually caused by a combination of CPU scheduling, memory pressure, storage I/O, thermal throttling, and software configuration.
## Identify the bottleneck
```bash
# 1. Check the overall system load (1/5/15 minute).
uptime
# A sustained load average above the number of CPU cores (for example, above 8.0 on an 8-core system) indicates insufficient CPU capacity.
# 2. Check CPU utilization by state (user, system, soft interrupt, and idle).
mpstat -P ALL 1 3
# 3. Check memory and swap usage (whether swap is in use).
free -h
# Less than 10% available memory with nonzero swap usage indicates memory pressure.
# 4. Check for a storage I/O bottleneck (a %util value close to 100% indicates that the disk is a bottleneck).
iostat -x 1 3
# 5. Check the temperature and CPU frequency (determine whether thermal throttling has occurred).
qpi-config dump temperature
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
```
Interpret the key metrics as follows:
- High %us: CPU-intensive tasks.
- High %sy: Excessive system call or driver overhead (such as software interrupt).
- High %wa: Storage I/O bottleneck.
- High %si: Excessive software interrupts (such as BLOCK softirq).
- Temperature above 80 °C: Potential thermal throttling.
- Very little available memory in **free -h**: Memory pressure.
## Apply targeted optimization
### CPU bottleneck (%us or %sy consistently above 60%)
- Identify the processes with the highest CPU utilization.
- Reduce the load generated by cameras and other peripherals.
- Increase the real-time priority of critical threads, for example, by adjusting the scheduling policy.
### Memory bottleneck ( low available memory and nonzero swap usage)
- Identify the Top 10 processes with the highest memory usage.
- Remove unnecessary log files.
- Check for DMA-BUF or ION memory leaks.
### Storage I/O bottleneck (%util in iostat close to 100%)
- Identify the process with the highest write I/O activity.
- Reduce unnecessary log writes.
- Check for processes that write files too frequently.
### Thermal throttling (frequency reduction caused by high temperature)
- Confirm whether the system has triggered frequency throttling.
- Apply active physical or software cooling measures.
# How can I configure a service to start at boot?
*systemd* is the standard init system used by most mainstream Linux distributions, including Yocto-based systems. It provides dependency management, automatic restart, and environment variable configuration.
## Create a service unit file
Create a .service file under */etc/systemd/system/* such as *my-camera.service*:
```
[Unit]
Description=My Camera Service
After=network.target # Start after the network is available (adjust as needed).
[Service]
Type=simple # Other types include forking and oneshot.
ExecStart=/usr/bin/my_script.sh
Restart=on-failure # Restart automatically after a failure.
User=root # Specify the user that runs the service (typically root).
WorkingDirectory=/opt/my_app
[Install]
WantedBy=multi-user.target # Start the service when the system enters multi-user mode.
```
## Enable and start the service
```bash
# Reload the systemd configuration.
sudo systemctl daemon-reload
# Enable the service to start at boot (creates a symbolic link).
sudo systemctl enable my-camera.service
# Start the service immediately (optional).
sudo systemctl start my-camera.service
# Check the service status.
sudo systemctl status my-camera.service
```
# How can I install a third-party driver?
1. Obtain the driver module file: Obtain the third-party driver source code and cross-compile it in an environment that matches the Quectel Pi H1's kernel version to generate a .ko module file.
2. Transfer the driver module file: Transfer the compiled .ko file to the Quectel Pi H1 through scp, adb, or a USB flash drive.
3. Load and unload the driver:
Run **insmod** to load the driver:
```bash
insmod your_driver.ko
```
Run **rmmod** to unload the driver:
```bash
rmmod your_driver
```
Run **lsmod** to list all loaded modules:
```
lsmod
```
# What should I do if no solution is available?
1. Visit [Technical FAQs]().
2. Post a question on the [Quectel Forums]().